<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
<title>MemcacheQ - Simple Queue Service over Memcache</title>
<style type="text/css">

/*
:Author: David Goodger
:Contact: goodger@users.sourceforge.net
:Date: $Date$
:Revision: $Revision$
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.

See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin-left: 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left {
  clear: left }

img.align-right {
  clear: right }

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font-family: serif ;
  font-size: 100% }

pre.literal-block, pre.doctest-block {
  margin-left: 2em ;
  margin-right: 2em ;
  background-color: #eeeeee }

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

tt.docutils {
  background-color: #eeeeee }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document" id="memcacheq-simple-queue-service-over-memcache">
<h1 class="title">MemcacheQ - Simple Queue Service over Memcache</h1>

<div class="section" id="features">
<h1>Features</h1>
<ul class="simple">
<li>damn simple</li>
<li>very fast</li>
<li>multiple queue</li>
<li>concurrent well</li>
<li>memcache protocol compatible</li>
</ul>
</div>
<div class="section" id="getting-started">
<h1>Getting Started</h1>
<div class="section" id="download">
<h2>Download</h2>
<p>See: &lt;<a class="reference external" href="http://code.google.com/p/memcacheq/downloads/list">http://code.google.com/p/memcacheq/downloads/list</a>&gt;</p>
</div>
<div class="section" id="installation">
<h2>Installation</h2>
<p>See: &lt;<a class="reference external" href="http://memcachedb.org/memcacheq/INSTALL.html">http://memcachedb.org/memcacheq/INSTALL.html</a>&gt;</p>
<p>Please take a look at 'ChangLog' file in the distribution, see what's new.</p>
</div>
<div class="section" id="commands">
<h2>Commands</h2>
<p>Only two commands are used to operate the queue:</p>
<p><strong>Append a message to the tail of queue</strong>:</p>
<pre class="literal-block">
set &lt;queue name&gt; &lt;flags&gt; 0 &lt;message_len&gt;\r\n
&lt;put your message body here&gt;\r\n
STORED\r\n
</pre>
<p><strong>Note:</strong> MQ will create a new queue automatically if your queue is not existed. The original 'expire time' field is ignored by server.</p>
<p><strong>Consume a message from the head of queue</strong>:</p>
<pre class="literal-block">
get &lt;queue name&gt;\r\n
VALUE &lt;queue name&gt; &lt;flags&gt; &lt;message_len&gt;\r\n
&lt;your message body will come here&gt;\r\n
END\r\n
</pre>
</div>
<div class="section" id="examples">
<h2>Examples</h2>
<p>Assuming you are using PHP memcache&lt;<a class="reference external" href="http://www.php.net/memcache">http://www.php.net/memcache</a>&gt;:</p>
<pre class="literal-block">
&lt;?php
/* connect to memcached server */
$memcache_obj = memcache_connect('memcacheq_host', 21201);

/* append a message to queue */
memcache_set($memcache_obj, 'demoqueue1', 'message body here', 0, 0);

/* consume a message from 'demoqueue1' */
memcache_get($memcache_obj, 'demoqueue1');

memcache_close($memcache_obj);
?&gt;
</pre>
</div>
</div>
<div class="section" id="limitation">
<h1>Limitation</h1>
<p>The message body is stored in Berkeley DB with fixed length. Any message that is shorter than the declared length will automatically be padded with space character (0x20 in the ASCII character set).</p>
<p>In Berkeley DB, as the official document refers,</p>
<p>&quot;For the Queue access method, the record length must be enough smaller than the database's page size that at least one record plus the database page's metadata information can fit on each database page.&quot;</p>
<p>&quot;The minimum page size is 512 bytes, the maximum page size is 64K bytes, and the page size must be a power-of-two.&quot;</p>
<p>So we have a limit on the message body size with a max of a bit less than <em>64K</em>.</p>
</div>
<div class="section" id="other-tips">
<h1>Other tips</h1>
<p>use 'stats queue' to see your current queues:</p>
<pre class="literal-block">
$ telnet 127.0.0.1 22201
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats queue
STAT test1
STAT test2
STAT test3
STAT test4
END
</pre>
<p>delete a queue:</p>
<pre class="literal-block">
$ telnet 127.0.0.1 22201
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
delete test1
DELETED
</pre>
<p>'db_stat' a queue to see how many records now in:</p>
<pre class="literal-block">
$ cd &lt;your queue dir&gt;
$ /usr/local/BerkeleyDB.4.7/bin/db_stat -d test1
Mon Sep 22 20:25:56 2008      Local time
42253   Queue magic number
4       Queue version number
1024    Fixed-length record size
0x20    Fixed-length record pad
4096    Underlying database page size
131072  Underlying database extent size
100000  Number of records in the database
33334   Number of database pages
2048    Number of bytes free in database pages (99% ff)
1       First undeleted record
100001  Next available record number
</pre>
</div>
<div class="section" id="feedback">
<h1>Feedback</h1>
<p>MemcacheDB mailing list now hosts on Google Group: <a class="reference external" href="http://groups.google.com/group/memcachedb">http://groups.google.com/group/memcachedb</a></p>
<ul class="simple">
<li>To subscribe to maillist, send email to <a class="reference external" href="mailto:memcachedb-subscribe&#64;googlegroups.com">memcachedb-subscribe&#64;googlegroups.com</a></li>
<li>To post to maillist, send email to <a class="reference external" href="mailto:memcachedb&#64;googlegroups.com">memcachedb&#64;googlegroups.com</a></li>
<li>To unsubscribe from maillist, send email to <a class="reference external" href="mailto:memcachedb-unsubscribe&#64;googlegroups.com">memcachedb-unsubscribe&#64;googlegroups.com</a></li>
</ul>
<p>Please report your bugs and issues to the Maillist.</p>
<p>Last updated by Steve Chu&lt;<a class="reference external" href="http://stvchu.org">http://stvchu.org</a>&gt;: 09/22/2008</p>
</div>
</div>
</body>
</html>
